package com.jumaojiang.service;

import com.jumaojiang.pojo.JeeUser;
import com.jumaojiang.utils.RedisUtil;
import com.jumaojiang.wxpusher.bean.CreateQrcodeReq;
import com.jumaojiang.wxpusher.bean.CreateQrcodeResp;
import com.jumaojiang.wxpusher.bean.Result;
import com.jumaojiang.wxpusher.bean.callback.CallBackData;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

import static com.jumaojiang.utils.JWTUtil.*;
import static com.jumaojiang.wxpusher.utils.WxPusher.createAppTempQrcode;

/**
 * forward
 *
 * @author wuhanwei
 * @version 1.0
 * @date 2021/11/4
 */
@Service
public class WxPusherAuthService {

    private static final String APP_TOKEN = "AT_UfgTUNKuqWwFvF3YdRdXfUd7G5LAYngi";

    @Autowired
    private RedisUtil redisUtil;

    /**
     * 存入一个用户验证消息(从wxpusher服务器关注成功通知得来)
     * @param authCode : 验证码的值
     * @return : 存入成功返回true, 失败返回false
     */
    public boolean saveAuthUserMsg(String authCode, CallBackData userMsg){
        // 五分钟过期 5*60 秒 time(单位秒)
        long l = redisUtil.sSetAndTime(authCode, 5 * 60, userMsg);
        if(l > 0){
            return true;
        }
        return false;
    }

    /**
     * 登陆验证
     * @param authCode : 需要判断的验证码
     * @return : 验证成功返回用户数据, 验证失败返回null
     */
    public CallBackData verifyAuthCode(String authCode){
        Set<Object> objects = redisUtil.sGet(authCode);
        Object[] toArray = objects.toArray();
        if(toArray.length > 0){
            CallBackData userMsg = (CallBackData)toArray[0];
            // 服务器生成的authCode会发送给wxpusher,用户关注成功会返回autoCode给服务器
            if(authCode.equals(userMsg.getExtra())){
                // 用户关注成功
                // 删除缓存信息
                redisUtil.del(authCode);
                return userMsg;
            }
        }
        // 用户还未关注
        return null;
    }

    /**
     * 用户请求登陆
     * @return : 返回二维码地址
     */
    public String getQRCodeUrl(String authCode){
        CreateQrcodeReq createQrcodeReq = new CreateQrcodeReq();
        // 二维码有效时间，s为单位，最大30天。
        createQrcodeReq.setValidTime(5*60); // 五分钟
        // 应用的apptoken
        createQrcodeReq.setAppToken(APP_TOKEN);
        // 验证所需的authCode
        createQrcodeReq.setExtra(authCode);
        // 创建带参数的app临时二维码
        Result<CreateQrcodeResp> appTempQrcode = createAppTempQrcode(createQrcodeReq);
        // 返回二维码地址
        return appTempQrcode.getData().getUrl();
    }

    /**
     * 创建jwtToken并存入cookie
     * @param response  : 请求响应体
     * @param user  : 用户数据
     * @return  : 执行成功返回true, 失败返回false
     */
    public String createJwtTokenAndSaveCookie(HttpServletRequest request, HttpServletResponse response, JeeUser user){
        Map<String, Object> payLoadMap = new HashMap<>();
        payLoadMap.put(PAYLOAD_USER_ID, user.getUserId());
        payLoadMap.put(PAYLOAD_USER_WX_HEAD_IMG, user.getUserWxHeadImg());
        // 用户昵称单独使用URLEncoder编码, 前端通过window.atob解出base64之后,再用decodeURIComponent单端解码
        String userName = null;
        try {
            userName = URLEncoder.encode(user.getUserWxName(), "utf-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
            return null;
        }
        payLoadMap.put(PAYLOAD_USER_WX_NICK_NAME, userName);
        payLoadMap.put(PAYLOAD_USER_IP_ADDRESS, user.getUserAddrIp());
        payLoadMap.put(WHETHER_OPEN_ADDRESS_VERIFICATION, "false"); // 默认开启ip验证
        // 传入参数获取jwtToken
        String jwtToken = generToken(payLoadMap);
        // 令牌添加到cookie
        Cookie cookie = new Cookie("jwtToken", jwtToken);
        cookie.setPath("/");
        // 获取前端域名
        String domain = request.getRequestURL().toString().split("/")[2];
        cookie.setDomain(domain);
        cookie.setMaxAge(365*24*60*60);     // 设置过期时间一年 365*24*60*60秒
        response.addCookie(cookie);
        return jwtToken;
    }
}


















